package com.core.exception;
import com.core.pojo.Result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 */
// @RestControllerAdvice = @ControllerAdvice + @ResponseBody
// 表示这个类的功能是作用于所有@RestController注解的控制器
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理我们自定义的业务异常
     * @param e 异常
     * @return Result
     */
    @ExceptionHandler(BusinessException.class)
    @ResponseStatus(HttpStatus.OK) // 即使是业务错误，HTTP状态码也可以是200，由响应体中的code决定
    public Result<String> handleBusinessException(BusinessException e) {
        log.warn("业务异常: {}", e.getMessage());
        // 从异常中获取信息，包装成Result对象返回给前端
        return Result.error(e.getMessage());
    }

    /**
     * 处理所有其他未被捕获的运行时异常（兜底方案）
     * @param e 异常
     * @return Result
     */
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 真正的服务器内部错误，返回500
    public Result<String> handleRuntimeException(RuntimeException e) {
        log.error("系统运行时异常", e); // 记录完整的堆栈信息，方便排查
        return Result.error("系统繁忙，请稍后重试"); // 给前端一个统一的、模糊的提示
    }
}